package draw.dao.handle;

import draw.common.pojo.EncryptPNumber;
import draw.common.util.EncryptUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.springframework.util.StringUtils;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 这个类实现了当数据和数据库交流时可以劫持特定的数据，对这数据进行处理之后在和数据库交流
 */
@Slf4j
@MappedTypes(EncryptPNumber.class)//被处理的类型
@MappedJdbcTypes(JdbcType.VARCHAR)//转换后的类型
public class EncryptPNumberTypeHandle extends BaseTypeHandler<EncryptPNumber> {

    /**
     * 处理劫持的数据 对号码时对称加密
     * @param ps 转换后端数据
     * @param i 这个数据在第几个占位符
     * @param parameter 被劫持的数据时什么
     * @param jdbcType  jdbc类型
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, EncryptPNumber parameter, JdbcType jdbcType) throws SQLException {
        if (parameter == null) {
            ps.setString(i, null);
            return;
        }

        //加密
        String str = EncryptUtil.encryptSym(parameter.getPNumber());

//        log.info("number; {}加密的内容: {}", parameter.getPNumber(), str);

        ps.setString(i, str);
    }

    //这下面的都是获取对应的值 分别是通过占位符名字和下标 第三个的区别是在insert的时候能够获取到增加的值
    @Override
    public EncryptPNumber getNullableResult(ResultSet rs, String columnName) throws SQLException {
        System.out.println("查到的number1= " + rs.getString(columnName));

        return decrypt(rs.getString(columnName));
    }

    @Override
    public EncryptPNumber getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        System.out.println("查到的number1= " + rs.getString(columnIndex));

        return decrypt(rs.getString(columnIndex));
    }

    @Override
    public EncryptPNumber getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        System.out.println("查到的number3= " + cs.getString(columnIndex));

        return decrypt(cs.getString(columnIndex));
    }

    private EncryptPNumber decrypt(String str) {
        if (!StringUtils.hasText(str)) {
            log.info("number为空");
            return null;
        }
        return new EncryptPNumber(EncryptUtil.decrypt(str));
    }
}
